/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.persistance.formation;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.PersistenceException;
import net.etrs.formathlon.entity.formation.Domaine;
import net.etrs.formathlon.entity.formation.Formation;
import net.etrs.formathlon.entity.formation.SeanceTh;
import net.etrs.formathlon.entity.formation.Session;
import net.etrs.formathlon.metier.utils.email.MailManager;
import net.etrs.formathlon.persistance.utils.AbstractFacade;
import net.etrs.formathlon.persistance.utils.JpaRequestNames;
import net.etrs.formathlon.persistance.utils.PersistanceUtils;
import org.apache.commons.mail.EmailException;

/**
 * Facade pour la gestion de l'entité Formation
 * @author OPIF
 */
@Stateless
public class FormationFacade extends AbstractFacade<Formation> {

    @EJB
    DomaineFacade df;
    @EJB
    private SessionFacade sessionFacade;
    @EJB
    private SeanceThFacade seanceThFacade;

    /**
     * En archivant une formation on fait de même avec ses listes.
     * @param t
     * @throws PersistenceException 
     */
    @Override
    public void delete(Formation t) throws PersistenceException {
        super.delete(t);
        //formation archivée, il faut faire de même avec ses listes
        for (Session session : t.getListSession()) {
            sessionFacade.delete(session);
        }
        for (SeanceTh seanceTh : t.getListSeanceTh()) {
            seanceThFacade.delete(seanceTh);
        }
    }
    
    /**
     * Retourne la liste des formations de base pour un domaine.
     * @param domaine Le domaine contenant les formations de bases.
     * @return La liste des formations de base.
     */
    public List<Formation> getListFormationBase(Domaine domaine){
        return getEm().createNamedQuery(JpaRequestNames.LISTE_FORMATION_BASE)
                .setParameter("domaine", domaine)
                .setParameter("complementaire", false)
                .getResultList();
    }
    
    /**
     * Retourne la liste des formations complémentaire pour un domaine.
     * @param domaine Le domaine contenant les formations complémentaires.
     * @return La liste des formations complémentaires.
     */
    public List<Formation> getListFormationComplementaire(Domaine domaine){
        return getEm().createNamedQuery(JpaRequestNames.LISTE_FORMATION_COMPLEMENTAIRE)
                .setParameter("domaine", domaine)
                .setParameter("complementaire", true)
                .getResultList();
    }

    /**
     * Renvoie les formations en cours:
     * date de fin plus loin qu'aujourd'hui
     * ou pas de date de fin donc en cours.
     * @return La liste de formation
     */
    public List<Formation> getFormationEnCours() {
        return getEm().createNamedQuery(JpaRequestNames.LISTE_FORMATION_EN_COURS)
                .setParameter("date", PersistanceUtils.AUJOURDHUI).getResultList();
    }

    /**
     * Ajoute la session à la formation.
     */
    public void addSession(Formation formation, Session session) {
        formation.getListSession().add(session);
    }

    /**
     * Retire la session de la formation
     * @param formation
     * @param session 
     */
    public void removeSession(Formation formation, Session session) {
        formation.getListSession().remove(session);
        try {
            MailManager.envoiSuppressionSession(session);
        } catch (EmailException ex) {
            Logger.getLogger(FormationFacade.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void create(Formation t) {
        /*
         * Dans la formation, la relation "liste de séance théorique" est mappée
         * par la séanceTh. Pour être certain que cette relation soit bien
         * persistée, il faut être sûr que l'ensemble des séances possèdent
         * la formation.
         */
        for (SeanceTh seanceTh : t.getListSeanceTh()) {
            seanceTh.setFormation(t);
        }
        super.create(t);
    }
}
